package cn.yanghx.transaction.study.service;

import cn.yanghx.transaction.study.entity.TestA;
import cn.yanghx.transaction.study.mapper.TestAMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;


@Slf4j
@Service
public class TestAServiceImpl extends ServiceImpl<TestAMapper, TestA> implements ITestAService {


    /**
     * 事务生效
     * 方法是定义在接口的。
     * 数据库操作都是在同一个方法内
     *
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public String aaa() {
        TestA a = new TestA();
        a.setId("123");
        a.setName("张三");
        a.setPhone("21");
        TestA b = new TestA();
        b.setId("1233");
        b.setName("李");
        b.setPhone("1");
        save(b);
        save(a);

        ///两个方法都被事务标记，可以回滚，这个要根据事务的传播机制细说，我还没理解。TODO
        bbb();

        return "代码执行完毕";
    }


    /**
     * 事务生效
     * 方法是定义在接口的。
     * 数据库操作都是在子方法内
     *
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public String bbb() {
        bbbA();
        bbbB();

        return "执行完毕";
    }

    private void bbbA() {
        TestA temp = new TestA();
        temp.setId("123");
        temp.setName("张三");
        temp.setPhone("21");

        save(temp);
    }

    private void bbbB() {
        TestA temp = new TestA();
        temp.setId("234");
        temp.setName("李四");
        temp.setPhone("21--李四李四李四李四李四李四李四李四李四李四李四李四李四李四李四李四李四----------------------");

        save(temp);
    }


    /**
     * 事务会失效
     * Transactional 注解 只能加在public的接口方法上。
     * 因为事务是通过aop来做的，需要被代理到才可以
     *
     * @return
     */
    public String ccc() {
        return cccImpl();
    }

    @Transactional(rollbackFor = Exception.class)
    public String cccImpl() {
        TestA temp = new TestA();
        temp.setId("123");
        temp.setName("张三");
        temp.setPhone("21");
        save(temp);


        TestA temp1 = new TestA();
        temp1.setId("234");
        temp1.setName("李四");
        temp1.setPhone("21--李四李四李四李四李四李四李四李四李四李四李四李四李四李四李四李四李四----------------------");

        save(temp1);

        return "执行完毕";
    }


}
